﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL.Ventas
{
    public class GetProformaList
    {
        int _count;



        public int Count(int idProyecto,
                                                           string docCliente,
                                                        string clienteStr,
                                                        string uiStr,
                                                        string numDocumento,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            return _count;
        }

       
        private IQueryable<ProformaListInfo> ApplySelect_ListInfo()
        {
            var q = from a in DbUtil.Db.Proformas
                   
                    select new ProformaListInfo
                    {
                        nombres =  a.nombre+" "+ a.apellido,
                        direccion = a.direccion,
                        docCliente = a.docCliente,
                        email = a.email,
                        fecha = a.fecha,
                        formatoVentaStr = a.FormatoVenta.descripcion,
                        idInternal = a.idInternal,
                        idProyecto = a.idProyecto,
                          vendedor=a.Empleado.descripcion,
                        numDocumento = a.numDocumento,
                        pregusnta1 = a.GrupoDatoitem.descripcion,

                        telefono = a.telefono,
                        total =a.total,
                         ui1LocalizacionStr=a.ProformaItems.First().UI.UILocalizacion.descripcion,
                        ui1EtapaStr = a.ProformaItems.First().UI.Etapa.descripcion,
                        ui1bloqueStr = a.ProformaItems.First().UI.UIBloque.descripcion,
                        ui1descripcionStr = a.ProformaItems.First().UI.descripcion,

                        //ui2LocalizacionStr = (a.ProformaItems.Count()>1?a.ProformaItems..UI.UILocalizacion.descripcion:""),
                        //ui2EtapaStr = (a.ProformaItems.Count() > 1 ? a.ProformaItems.ElementAt(1).UI.Etapa.descripcion : ""),
                        //ui2bloqueStr = (a.ProformaItems.Count() > 1 ? a.ProformaItems.ElementAt(1).UI.UIBloque.descripcion : ""),
                        //ui2descripcionStr = (a.ProformaItems.Count() > 1 ? a.ProformaItems.ElementAt(1).UI.descripcion : ""),
                        
                    };
            return q;
        }
        private IQueryable<ProformaListInfo> ApplySort(IQueryable<ProformaListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "numDocumento":
                    q = q.OrderBy(b => b.numDocumento);
                    break;
                case "numDocumento DESC":
                    q = q.OrderByDescending(b => b.numDocumento);
                    break;

                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;

                case "direccion":
                    q = q.OrderBy(b => b.direccion);
                    break;
                case "direccion DESC":
                    q = q.OrderByDescending(b => b.direccion);
                    break;


                case "docCliente":
                    q = q.OrderBy(b => b.docCliente);
                    break;
                case "docCliente DESC":
                    q = q.OrderByDescending(b => b.docCliente);
                    break;


                case "email":
                    q = q.OrderBy(b => b.email);
                    break;
                case "email DESC":
                    q = q.OrderByDescending(b => b.email);
                    break;


                case "formatoVentaStr":
                    q = q.OrderBy(b => b.formatoVentaStr);
                    break;
                case "formatoVentaStr DESC":
                    q = q.OrderByDescending(b => b.formatoVentaStr);
                    break;

                case "nombres":
                    q = q.OrderBy(b => b.nombres);
                    break;
                case "nombres DESC":
                    q = q.OrderByDescending(b => b.nombres);
                    break;

                default:
                    q = q.OrderByDescending(b => b.fecha).OrderByDescending(p => p.numDocumento);
                    break;
            }
            return q;
        }



        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<ProformaListInfo> Execute(int idProyecto, 
                                                           string docCliente,
                                                        string clienteStr, 
                                                        string uiStr,
                                                        string numDocumento,
                                                           int startRowIndex,
                                                           int maximumRows,
                                                           string sortExpression)
        {
            
            

            if (!clienteStr.HasValue())
                clienteStr = "";
            if (!docCliente.HasValue())
                docCliente = "";
            if (!uiStr.HasValue())
                uiStr = "";
            if (!numDocumento.HasValue())
                numDocumento = "";
            var q = ApplySelect_ListInfo();


            q = q.Where(a => a.nombres.Contains(clienteStr)
                              & a.ui1descripcionStr.Contains(uiStr)
                              //& a.ui2descripcionStr.Contains(uiStr)
                              & a.docCliente.Contains(docCliente)
                              & a.numDocumento.Contains(numDocumento)
                              & a.idProyecto == idProyecto
                             );


            _count = q.Count();

            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows);
        }



    }
}
